package cn.dwy2002.task.impl;

import cn.dwy2002.task.mapper.TaskTypeMapper;
import cn.dwy2002.task.service.ITaskTypeService;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dwy2002.common.Result;
import com.dwy2002.common.utils.Validator;
import com.dwy2002.enums.Status;
import com.dwy2002.pojo.dto.task.TaskTypeDTO;
import com.dwy2002.pojo.po.task.TaskType;
import com.dwy2002.pojo.vo.task.TaskTypeSimpleVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.dwy2002.common.Result.*;
import static com.dwy2002.common.utils.Utils.isListEmpty;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/07/14
 */
@Service
@RequiredArgsConstructor
public class TaskTypeServiceImpl extends ServiceImpl<TaskTypeMapper, TaskType> implements ITaskTypeService {
    /**
     * 创建任务类型
     *
     * @param dto 任务类型DTO
     * @author 杜伟毅
     * @since 2025/7/21 0021 11:07
     */
    @Override
    public Result<Void> createTaskType(TaskTypeDTO dto) {
        Validator.of(dto)
                .notEmpty(TaskTypeDTO::getName, "任务类型名称不能为空")
                .validate();
        boolean save = save(BeanUtil.copyProperties(dto, TaskType.class));
        return saveResult(save, "添加任务类型成功", "添加任务类型失败");
    }

    /**
     * 批量删除任务类型（逻辑删除）
     *
     * @param ids 类型ID列表
     * @author 杜伟毅
     * @since 2025/7/21 0021 11:07
     */
    @Override
    public Result<Void> deleteTaskTypes(List<String> ids) {
        if (isListEmpty(ids)) return fail(Status.BAD_REQUEST, "ID不允许为空");

        List<TaskType> taskTypes = list(new LambdaQueryWrapper<TaskType>().in(TaskType::getId, ids));
        List<String> validIds = taskTypes.stream().map(TaskType::getId).toList();
        boolean remove = removeByIds(validIds);

        return handleResult(remove, "任务类型删除成功", "任务类型删除失败");
    }

    /**
     * 更新任务类型信息
     *
     * @param dto 任务类型DTO
     * @author 杜伟毅
     * @since 2025/7/21 0021 11:07
     */
    @Override
    public Result<Void> updateTaskType(TaskTypeDTO dto) {
        Validator.of(dto)
                .notEmpty(TaskTypeDTO::getId, "ID不允许为空")
                .notEmpty(TaskTypeDTO::getName, "任务类型名称不能为空")
                .validate();

        TaskType taskType = getById(dto.getId());
        if (ObjectUtils.isEmpty(taskType)) return fail(Status.BAD_REQUEST, "ID无效");

        LambdaUpdateWrapper<TaskType> luw = new LambdaUpdateWrapper<>();
        luw.eq(TaskType::getId, dto.getId())
                .set(TaskType::getName, dto.getName())
                .set(!StringUtils.equals(taskType.getDescription(), dto.getDescription()), TaskType::getDescription, dto.getDescription());
        boolean update = update(luw);
        return handleResult(update, "任务类型修改成功", "任务类型修改失败");
    }

    /**
     * 获取所有有效的任务类型
     *
     * @author 杜伟毅
     * @since 2025/7/21 0021 11:07
     */
    @Override
    public Result<List<TaskTypeSimpleVO>> getAllActiveTypes() {
        LambdaQueryWrapper<TaskType> lqw = new LambdaQueryWrapper<>();
        return success(BeanUtil.copyToList(list(lqw), TaskTypeSimpleVO.class));
    }
}
